查看原文
其他

用SQL解析神奇的扑克牌魔术

2015-02-09 杨廷琨 云和恩墨

日前据媒体爆料,已上过多届春晚的魔术师刘谦因档期等原因婉拒了央视春晚的邀请,而马年春晚的魔术师YIF今年也没有上春晚的行程。但是可以确定的是,今年我们又会在春晚上看到魔术表演这一环节。


在前几年,刘谦在春晚上的魔术表演让大街小巷为之沸腾的之时,众多网友网上发布了各种破解方法,试图为大家揭露出魔术背后的种种:「哦原来是酱紫呀」。但是呢,要说魔术这事既然你感叹他表演时的惊奇,就已经让你对这个形式的表演方法表示接受与理解,然而之后去试图了解他的背后的手法,会让你更明白魔术与数学等各种知识相关联。下面,云和恩墨专家杨廷琨带你了解如何用SQL去解释经典的扑克牌魔术。


老杨带你用SQL解释经典的扑克牌魔术


一个偶然的机会在电视上看到一个有关扑克牌的魔术,觉得很有意思。这个魔术明显不是靠手快或者做假来实现的,奥妙在于魔术中包含了数学原理。


(相关视频高清版请点击阅读原文!...看完感觉好腻害厚~务必在WiFi状态下点开噢~)


首先描述一下这个魔术,有兴趣的话,可以按照这个方法试一试。


从一副扑克牌中随意抽取21张牌。让观众从这些牌中随意选择一张,这张牌就是最后通过魔术需要找到的目标牌。让观众牢记后将其放回到其余20张牌中,然后任意洗牌。


下面开始进行发牌的工作,发牌和普通扑克的发牌规则一样。将牌发成3叠,每叠7张。将每叠牌依次展示给观众,要求观众确认目标牌在3叠的哪一叠中即可。


之后将3叠牌合在一起,将包含目标牌的一叠放在其他两叠牌中间。注意此时不要打乱每叠牌的顺序。


然后再次发牌,和刚才完全一样,还是将牌发成3叠。让对方确认目标牌所在的一叠,将这叠牌放到另外两叠牌的中间。


最后,再次重复上面的发牌、确认此过程,仍然将包含目标牌的那叠牌,放到另外两叠牌的中间。


下面神奇的时刻到来了:从这叠扑克牌的上面每次拿起一张,每拿起一张牌的同时要说一句话:“你要相信魔术你的牌是”。说完这句话,下一张牌就是目标牌了。


看上去这个魔术很神奇,而且最神奇的是,这个魔术任何人都可以来表演。这就说明无论这张牌最初在哪个位置,只要按照这个规则最后都一定会来到这个指定的位置。


看了这个魔术,不禁有点手痒,既然是DBA出身,就用SQL来演示一下这个魔术的过程吧,见如下代码:

SQL> WITH A AS
2 (SELECT ROWNUM P FROM DUAL CONNECT BY LEVEL <= 21)
3 SELECT
4 7 + CEIL(
5 (7 + CEIL(
6 (7 + CEIL(P/3))
7 /3))
8 /3)
9 FROM A;
7+CEIL((7+CEIL((7+CEIL(P/3))/3))/3)
-----------------------------------
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11

已选择21行。


简单地解释一下这个SQL:设WITH查询中的P表示这张牌的初始位置,这个位置的取值范围是从1到21。而后将牌按照发牌的顺序分成3份,于是这张牌的位置变为CEIL(P/3)。由于在魔术表演的过程中,目标牌所在的那一叠牌会放在其他两叠牌的中间,也就是说目标牌的前面增加了7张牌,因此目标牌的位置要增加7。


魔术中上面的步骤重复了3次,因此在SQL中这个过程也重复3次,最终SQL返回的结果就是目标牌21种不同初始位置所对应的魔术结束时刻目标牌的最终位置。


根据计算结果可以看到,无论这张牌在哪里,最终都会达到第11张的位置。这也就是这个魔术的奥秘之所在。


不过SQL只是演示了结果,并没有给出为什么会出现这种结果的答案,下面通过数学手段简单分析一下:


由于第一次平均分的时候这张牌的位置是任意的,所以这次平均分的意义不大。这次平均分的目的只是将目标牌的那一份放到中间的位置。所以可以认为这张牌在中间位置第1到7的任何一个位置上,因此这张牌的位置就是7 + p。下面将牌分成三份,然后将目标牌堆放到中间,这时这张牌的位置变为7 +(7+p)/3。最后再重复一次这个动作,最终结果变为:7 + (7 + (7+p)/3)/3。


对上面的表达式进行通分计算后,结果变成(7*9 + 7*3 + 7 + p)/9,进一步简化变成(91 +p)/9,最后变成了10 + (1+p)/9,而p的位置是1到7,也就是说无论取何值,(1+p)/9都不会大于1,所以最终的结果是11。


最后,应该修改一下魔术中咒语:“你要相信数学你的牌是”。


附:扑克牌魔术之不看牌猜中不同花色的牌数


表演者取出一副扑克牌,为表明没有动手脚,不妨请一位观众来洗几次牌。然后,将扑克牌牌面向下一张一张把放到桌面上,观众可以随时叫停。叫停之后,桌子上的牌归观众。此时双方都不翻开各自手上的牌,表演者说,“我现在用心灵感应来猜一下我的牌里和你的牌里各有多少张红色的和黑色的”,随即要求观众从一叠牌里取出一定数量的牌放到另一叠里,例如“请你从你手上的牌里选1张红色牌、2张黑色牌放到我的这叠里”。在此之后,表演者一阵心灵感应,就可以宣称,第一叠牌里的红色牌和另一叠牌里的黑色牌数量是相等的了。如果观众验证的话,就会发现果真如此。


魔术揭秘: 为什么呢?其实这个魔术的原理很简单,表演者只需要记住牌的数量,想办法让两叠牌的数量都是26张就可以。而要求观众匀牌的过程,就是平分这副牌的过程。当两叠牌数是相等的时候,那显然就会有:

第二叠牌中红牌数量+第二叠牌中黑牌数量=26

第一叠牌中红牌数量+第二叠牌中红牌数量=26

第一叠牌中红牌数量+第一叠牌中黑牌数量=26


解方程组可得:第一叠牌中红牌数量 = 第二叠牌中黑牌数量


以上是魔术的数学解析。作为一名专业的DBA,大家可以考虑如何用相关知识来解释这个魔术噢



内容参考:

  • 《Oracle DBA手记1 - 第一篇 yangtingkun的DBA工作手记》

  • 果壳网科学人版块,作者Albert_JIAO,电子工程专业学生,科学松鼠会成员,原文链接:http://www.guokr.com/article/62940/

  • 配图来源:驱动之家网站



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存